#include <iostream>
#include <deque>
#include <stack>
#include <vector>
using namespace std;

class StackOfPlates {
    deque<stack<int>> ds;
    vector<int> vec_count; //记录每个子栈的数量
    int count = 0; // 记录子栈的容量
public:
    StackOfPlates(int cap)
    {
        // stack<int> st;
        count = cap;
        // vec_count.push_back(0);
        // ds.push_back(st);
    }
    
    void push(int val) 
    {
        if(count == 0) return;
   
        if(ds.size() == 0 || vec_count[vec_count.size()-1] == count)
        {
            stack<int> st;
            st.push(val);
            vec_count.push_back(1);
            ds.push_back(st);
        }
        else
        {
            ds[ds.size()-1].push(val);
            ++vec_count[vec_count.size()-1];
        } 
        
       
    }
    
    int pop()
    {
        // return popAt(ds.size() - 1);
        if (ds.size() == 0)
            return -1;
        int stp = ds[ds.size()-1].top();
        ds[ds.size()-1].pop();
        --vec_count[vec_count.size()-1];
        if(vec_count[vec_count.size()-1] == 0)
        {
            ds.pop_back();
            vec_count.pop_back();
        }
        return stp;
    }
    
    int popAt(int index) 
    {
        if(ds.size() < index + 1) return -1;
        int stp = ds[index].top();
        ds[index].pop();
        --vec_count[index];
        if(vec_count[index] == 0)
        {
            ds.erase(ds.begin()+index);
            vec_count.erase(vec_count.begin()+index);
        }
        return stp;
    }
};


int main()
{
    StackOfPlates st(1);
    st.push(1);
    st.push(2);
    // st.push(3);
    // st.push(4);
    
    cout << st.popAt(1) << endl;
    cout << st.pop() << endl;
    cout << st.pop() << endl;

    // vector<int> vec;
    // vec.push_back(1);
    // vec.push_back(2);
    // vec.push_back(3);
    // cout << vec.size() << endl;
    // vec.erase(vec.begin()+1);
    // cout << vec[1] << endl;

    return 0;
}